package arithmetic.LeetCode;

import java.util.ArrayList;
import java.util.List;

/**
 * @author jiangfeng on 2023/4/24
 */
public class SpiralOrder {
    public static void main(String[] args) {
        System.out.println(new Solution().spiralOrder(new int[][] {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}));
    }

    static class Solution {
        public List<Integer> spiralOrder(int[][] matrix) {
            // 行边界
            int l = 0, r = matrix[0].length - 1;
            // 列边界
            int u = 0, d = matrix.length - 1;


            List<Integer> res = new ArrayList(matrix[0].length * matrix.length);

            while(l<=r && u<=d){
                // 上
                for(int i=l;i<=r;i++){
                    res.add(matrix[u][i]);
                }
                u++;

                if(u>d){
                  continue;
                }
                // 右
                for(int i=u;i<=d;i++){
                    res.add(matrix[i][r]);
                }
                r--;
                if(r<l){
                    continue;
                }
                // 下
                for(int i=r;i>=l;i--){
                    res.add(matrix[d][i]);
                }
                d--;
                // 左
                for(int i=d;i>=u;i--){
                    res.add(matrix[i][l]);
                }
                l++;
            }

            return res;

        }

    }

    static class Solution2 {
        public List<Integer> spiralOrder(int[][] matrix) {
            // 行边界
            int l = 0, r = matrix[0].length - 1;
            // 列边界
            int u = 0, d = matrix.length - 1;


            List<Integer> res = new ArrayList(matrix[0].length * matrix.length);

            // 指针
            int i = 0;
            int j = 0;
            while (i >= u && i <= d && j >= l && j <= r) {
                if (i == u) {
                    // 角交给下一个
                    while (j < r) {
                        res.add(matrix[i][j++]);
                    }
                    u++;
                }
                if (j == r) {
                    while (i < d) {
                        res.add(matrix[i++][j]);
                    }
                    r--;

                }

                if (i == d) {
                    while (j > l) {
                        res.add(matrix[i][j--]);
                    }
                    d--;
                }
                if (j == l) {
                    while (i > u) {
                        res.add(matrix[i--][j]);
                    }
                    l++;

                    res.add(matrix[i][j]);
                    j++;

                }

            }

            return res;

        }

    }
}
